raise関数は、この関数を呼び出したプロセスにシグナルを送ります。
#include <signal.h>
int raise(int signum);
signumは送るシグナルを指定します。
戻り値として、正常に送れた場合は0を、送れなかった場合は0以外を返します。
第1引数のsignumに指定できる値は、signal.hファイルに定義されています。また、UNIX系OSの場合は、kill -l
コマンドで表示できます。
次の例題プログラムは0又は、SIGINTシグナル(CtrlキーとCキーを同時に押下することにより発生)を3回発行すると終了します。
プログラム 例
#include <stdio.h> #include <stdlib.h> #include <signal.h> /* ユーザ定義関数の宣言 */ void SetSignal(int SignalName); void SigHandler(int SignalName); void Input(void); int main(void) { SetSignal(SIGINT); Input(); return 0; } void Input(void) { int in_data; printf('0又はCtl+Cを3回入力すると終了します\n'); while(1) { printf('整数を入力してください ==> '); scanf('%d', &in_data); if (in_data == 0) { raise(SIGINT); } } return; } /* シグナルの設定 */ void SetSignal(int p_signame) { if (signal(p_signame, SigHandler) == SIG_ERR) { /* シグナル設定エラー */ printf('シグナルの設定が出来ませんでした。終了します\n'); exit(1); } return; } /* シグナル受信/処理 */ void SigHandler(int p_signame) { static int sig_cnt = 0; ++sig_cnt; if (sig_cnt <= 2) { putchar(0x07); /* ベルを鳴らす */ fflush(stdout); } else { printf('\n%d回目の割り込みです。終了します\n', sig_cnt); exit(0); } /* シグナルの再設定 */ SetSignal(p_signame); return; }
例の実行結果
Ctl+Cを1回入力しています。
$ ./raise.exe 0又はCtl+Cを3回入力すると終了します 整数を入力してください ==> 1 整数を入力してください ==> 2 整数を入力してください ==> 0 整数を入力してください ==> 4 整数を入力してください ==> 5 整数を入力してください ==> 6 整数を入力してください ==> 7 整数を入力してください ==> 8 整数を入力してください ==> 0 3回目の割り込みです。終了します $